#ifndef HW_LIN_H
#define HW_LIN_H

//*************************************************************************************************
//
// The following are defines for the LIN register offsets
//
//*************************************************************************************************

#define LIN_O_LBUF           0x00U // 数据缓冲寄存器
#define LIN_O_LSEL           0x01U // 选择寄存器
#define LIN_O_LID            0x02U // ID 寄存器
#define LIN_O_LER            0x03U // 错误寄存器
#define LIN_O_LIE            0x04U // 中断使能寄存器
#define LIN_O_LSR            0x05U // 状态寄存器
#define LIN_O_LCR            0x05U // 控制寄存器
#define LIN_O_DLL            0x06U // 波特率寄存器
#define LIN_O_DLH            0x07U // 波特率寄存器
#define LIN_O_HDRL           0x08U // 帧头延迟低位寄存器
#define LIN_O_HDRH           0x09U // 帧头延迟高位寄存器
#define LIN_O_HDP            0x0AU // 帧头延迟分频器
#define LIN_O_LBS            0x0BU // 总线状态寄存器
#define LIN_O_WURT           0x0CU // 唤醒响应超时寄存器
#define LIN_O_IDTL           0x0DU // 空闲检测时间（低）寄存器
#define LIN_O_IDTH           0x0EU // 空闲检测时间（高）寄存器

//*************************************************************************************************
//
// The following are defines for the bit fields in the LBUF register
//
//*************************************************************************************************
#define LIN_LBUF_LBUF_S            0x0U // Data buffer register
#define LIN_LBUF_LBUF_M            0xFFU //
//*************************************************************************************************
//
// The following are defines for the bit fields in the LSEL register
//
//*************************************************************************************************
#define LIN_LSEL_INDEX_S           0x0U       //LIN响应数据字节放入FIFO数据缓冲区的位置。
#define LIN_LSEL_INDEX_M           0x1FU       //

#define LIN_LSEL_DLY_A             0x0U       // 延迟禁用(设置DLY位来增加写入LCR寄存器和在DLIN中执行命令之间的延迟)
#define LIN_LSEL_DLY_B             0x20U      // 延迟长度为LIN总线比特长度的1/2(设置DLY位来增加写入LCR寄存器和在DLIN中执行命令之间的延迟)
#define LIN_LSEL_DLY_C             0x40U      // 延迟长度为LIN总线比特长度的3/4(设置DLY位来增加写入LCR寄存器和在DLIN中执行命令之间的延迟)
#define LIN_LSEL_DLY_D             0x60U      // 延迟长度为LIN总线1比特长度(设置DLY位来增加写入LCR寄存器和在DLIN中执行命令之间的延迟)
#define LIN_LSEL_AINC              0x80U      //自增模式启用

//*************************************************************************************************
//
// The following are defines for the bit fields in the LID register
//
//*************************************************************************************************
#define LIN_LID_ID_2            0x1U      //LIN总线标识符 2 字节
#define LIN_LID_ID_4            0x2U      //LIN总线标识符 4 字节
#define LIN_LID_ID_8            0x3U      //LIN总线标识符 8 字节

//*************************************************************************************************
//
// The following are defines for the bit fields in the LER register
//
//*************************************************************************************************
#define LIN_LER_FER            0x1U    //检测到帧错误
#define LIN_LER_BITER          0x2U    //检测到比特错误
#define LIN_LER_PER            0x4U    //接收到的帧头检测出奇偶校验错误
#define LIN_LER_CHKSER         0x8U    //检测到校验和错误
#define LIN_LER_TOVER          0x10U   //检测到超时错误
#define LIN_LER_SYNCER         0x20U   //同步错误标志（仅从节点）,同步字段的边沿超出了公差的最大值
#define LIN_LER_OVER           0x40U   //检测到过载错误
#define LIN_LER_WAKEER         0x80U   //唤醒错误标志（仅从节点）,未接收到主节点的唤醒响应

//*************************************************************************************************
//
// The following are defines for the bit fields in the LIE register
//
//*************************************************************************************************
#define LIN_LIE_LIDE           0x1U    //帧头接收中断使能（仅从机）
#define LIN_LIE_RDYE           0x2U    //就绪中断使能
#define LIN_LIE_ERRE           0x4U    //错误中断使能
#define LIN_LIE_ABORTE         0x8U    //ABORT中断使能
#define LIN_LIE_SLEEPE         0x10U   //睡眠中断使能
#define LIN_LIE_WAKEE          0x20U   //唤醒检测中断使能

//*************************************************************************************************
//
// The following are defines for the bit fields in the LSR register
//
//*************************************************************************************************
#define LIN_LSR_LID            0x1U    //帧头接收标志（仅从节点）,完成帧头接收
#define LIN_LSR_RDY            0x2U    //就绪标志,当前命令正在执行中
#define LIN_LSR_ERR            0x4U    //错误标志,传输出错
#define LIN_LSR_ABORT          0x8U    //ABLORT 命令标志,当前执行的命令被中止
//#define LIN_LSR_LOGSIZE_S      0x8U    //ABLORT 命令标志,当前执行的命令被中止

//*************************************************************************************************
//
// The following are defines for the bit fields in the LCR register
//
//*************************************************************************************************
#define LIN_LCR_CMD_ABORT      0x0U    //ABORT 命令
#define LIN_LCR_CMD_SHEAD      0x1U    //发送帧头命令（仅主机模式）当SIZE[3:0]!="1101"时
#define LIN_LCR_CMD_SWAKE      0x1U    //发送唤醒命令当SIZE[3:0]=="1101"
#define LIN_LCR_CMD_SAUTO      0x1U    //发送自动比特率检测命令当SIZE[3:0]=="1100"
#define LIN_LCR_CMD_TX         0x2U    //TX响应命令
#define LIN_LCR_CMD_RX         0x3U    //RX响应命令
#define LIN_LCR_SIZE_AUTOBDEC       0x30U    //自动比特率检测
#define LIN_LCR_SIZE_WAKMOD         0x34U    //唤醒模式
#define LIN_LCR_SIZE_STLMOD         0x38U    //转换至日志模式
#define LIN_LCR_SIZE_STLID          0x3CU    //将帧长指示器切换至LID[5:4]
#define LIN_LCR_LIN13               0x40U    //经典检验和，与LIN 1.3规范兼容
#define LIN_LCR_MODE                0x80U    //主机模式

//*************************************************************************************************
//
// The following are defines for the bit fields in the DLL register
//
//*************************************************************************************************
#define LIN_DLL_DLL_S        0x0U    //波特率分割最小有效位
#define LIN_DLL_DLL_M        0xFFU    //波特率分割最小有效位

//*************************************************************************************************
//
// The following are defines for the bit fields in the DLH register
//
//*************************************************************************************************
#define LIN_DLH_DLH_S        0x0U     //[6:0]波特率分割最大有效比特位
#define LIN_DLH_DLH_M        0x7FU    //[6:0]波特率分割最大有效比特位
#define LIN_DLH_SYNCER       0x80U    //启用同步模式

//*************************************************************************************************
//
// The following are defines for the bit fields in the HDR register
//
//*************************************************************************************************
#define LIN_HDR_HDRL_S       0x0U    //指定了切换发送报头命令之间的额外延迟
#define LIN_HDR_HDRL_M       0xFFU
#define LIN_HDR_HDRH_S       0x0U
#define LIN_HDR_HDRH_M       0xFFU

//*************************************************************************************************
//
// The following are defines for the bit fields in the HDP register
//
//*************************************************************************************************
#define LIN_HDP_HDP_S       0x0U    //指定了HDR寄存器递减的时间间隔
#define LIN_HDP_HDP_M       0x3FU

//*************************************************************************************************
//
// The following are defines for the bit fields in the LBS register
//
//*************************************************************************************************
#define LIN_LBS_SLEEPM       0x1U    //DLIN处于睡眠模式
#define LIN_LBS_WAKEUP       0x2U    //检测到唤醒信号
#define LIN_LBS_SLEEP        0x4U    //睡眠条件发生

//*************************************************************************************************
//
// The following are defines for the bit fields in the LBS register
//
//*************************************************************************************************
#define LIN_WURT_WURT_S      0x0U    //用于在等待响应状态下与唤醒响应定时器值进行比较
#define LIN_WURT_WURT_M      0xFFU    //用于在等待响应状态下与唤醒响应定时器值进行比较

//*************************************************************************************************
//
// The following are defines for the bit fields in the IDT register
//
//*************************************************************************************************
#define LIN_IDT_IDTL_S       0x0U    //用来与空闲检测计时器值进行比较
#define LIN_IDT_IDTL_M       0xFFU
#define LIN_IDT_IDTH_S       0x0U
#define LIN_IDT_IDTH_M       0x1FU
#define LIN_IDT_IDTH_IDTRUN       0x80U

#endif
